/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package compilador.analisadorSintatico.operacoes;

import compilador.analisadorLexico.Token;
import compilador.analisadorSintatico.Producao;
import compilador.analisadorSintatico.TokenReader;
import compilador.analisadorSintatico.simboloGramatical.NaoTerminal;
import compilador.analisadorSintatico.simboloGramatical.SimboloGramatical;
import compilador.analisadorSintatico.simboloGramatical.Terminal;

/**
 *
 * @author Joao
 */
public class FATOR extends Producao{

    //<FATOR> ::= '(' <EXP> ')' | <NRO>
    
    @Override
    public void setSimbolo() {
        this.simbolo = new NaoTerminal(this.getClass().getSimpleName());
    }

    @Override
    public SimboloGramatical derivar() throws Exception {

        TokenReader tokenReader =  TokenReader.getInstance();

        Token t = tokenReader.seeCurrent();

        if(t.getAtributo().equals("("))
        {
            ((NaoTerminal)  this.simbolo).add(new Terminal(t));
            t = tokenReader.consome();

            ((NaoTerminal)  this.simbolo).add(new EXP().derivar());
            
            t = tokenReader.seeCurrent();

            if(t.getAtributo().equals(")"))
            {
                ((NaoTerminal)  this.simbolo).add(new Terminal(t));
                t = tokenReader.consome();
            }
            else
            {
                erro("Fechamento de parêntesis não encontrado próximo a "
                        +t.getAtributo().toString()+". Linha "+t.getLinha()+".");
                return this.simbolo;
            }
        }
        else
        {
            ((NaoTerminal)  this.simbolo).add(new NRO().derivar());
        }

        return ((NaoTerminal)  this.simbolo);
    }

}
